package com.ljk.helloworld.controller;

import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

/**
 * <p>{@link RestController}主要包含了{@link Controller}和{@link ResponseBody}</p>
 * <p>{@link Controller}将类注册为spring的controller</p>
 * <p>{@link ResponseBody} 作用[方法中的返回默认返回JSON格式,不再请求相应的视图解析器] 作用域:[定义该类内的所有（带mapping的）的方法,也可以不加在类上单独加在方法上单独控制]</p>
 * <p>{@link RequestMapping}加在类上或者方法上的作用是生成模拟路径,使程序可以使用http访问接口(类上的可以忽略注释掉)</p>
 *
 * @author leng
 * @description HelloWorld
 * @date 2020/11/24 0:20
 * @since 1.0
 */
@RestController
public class HelloWorldController {

    /**
     * desc: Hello World
     * <p>{@link RequestMapping}不指定method的时候接收所有请求</p>
     * <p>{@link RequestParam}required控制参数是否必填,name自定义参数接收名</p>
     * @param name 姓名,非必填
     * @return String
     * @author ljk
     * @date 2020/11/24 0:32
     */
    @RequestMapping("/hello")
    public String hello(@RequestParam(required = false, name = "name") String name) {
        name = StringUtils.isEmpty(name)?"World":name;
        return String.format("Hello %s", name);
    }

    /**
     * desc: Hello World
     * <p>{@link RequestMapping}不指定method的时候接收所有请求</p>
     * <p>{@link PathVariable}将链接中的id装到参数中,优先级最高</p>
     * @param name 姓名,非必填
     * @return String
     * @author ljk
     * @date 2020/11/24 0:32
     */
    @RequestMapping("/hello/{id}")
    public String helloId(@PathVariable("id")String name) {
        name = StringUtils.isEmpty(name)?"World":name;
        return String.format("Hello %s", name);
    }
   /**
     * desc: Hello World
     * <p>{@link RequestMapping}不指定method的时候接收所有请求</p>
    *  HttpServletRequest这个参数,当controller需要用流或者复杂的需求时,可以选择加在controller方法中
    *  method配置了只限get和post方法访问
     * @return String
     * @author ljk
     * @date 2020/11/24 0:32
     */
    @RequestMapping(value = "/hello2",method = {RequestMethod.GET,RequestMethod.POST})
    public String hello2(HttpServletRequest request) {
        String contextPath = request.getContextPath();
        String method = request.getMethod();
        return String.format("Hello %s", "name");
    }

    /************************************
     * 以下几个方法主要演示的是可以用同一个链接调用不同的方法,代码中并未全部列出,注释中比较全
     * Get进GetMapping,Post进PostMapping等等
     * <p>{@link GetMapping} get方法,用于查询,对标数据库的select</p>
     * <p>{@link PostMapping}post方法,用于提交数据,通常用来向服务器提交更新数据,对标数据库的update</p>
     * <p>{@link PutMapping}put方法,用于提交数据,通常用来向服务器新增数据,对标数据库的insert</p>
     * <p>{@link PatchMapping}</p>
     * <p>{@link DeleteMapping}delete方法,用于删除数据,对标数据库的delete</p>
     *
     ************************************/
    @GetMapping("/request")
    public String goRequestGet(String name) {
        name = StringUtils.isEmpty(name)?"World":name;
        return String.format("[%s]Hello %s", "GetMapping", name);
    }
    @PostMapping ("/request")
    public String goRequestPost(String name) {
        name = StringUtils.isEmpty(name)?"World":name;
        return String.format("[%s]Hello %s", "PostMapping", name);
    }
    @DeleteMapping ("/request")
    public String goRequestDelete(String name) {
        name = StringUtils.isEmpty(name)?"World":name;
        return String.format("[%s]Hello %s", "DeleteMapping", name);
    }
    @PutMapping ("/request")
    public String goRequestPut(String name) {
        name = StringUtils.isEmpty(name)?"World":name;
        return String.format("[%s]Hello %s", "PutMapping", name);
    }
}
